package com.demo.java.OD201_250.OD219;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【开心消消乐】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145915160
 */
public class OdMain {
    public static void main(String[] args) {
        try (Scanner s = new Scanner(System.in)) {
            int n = s.nextInt(), m = s.nextInt(), t = 0;
            int[][] a = new int[n][m];

            // 读取输入的矩阵
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    a[i][j] = s.nextInt();

            // 遍历矩阵，找到每个未访问的1
            for (int i = 0; i < n * m; i++) {
                int x = i / m, y = i % m, cur = a[x][y];
                if (cur == 1) {
                    t++; // 每找到一个新的连通分量，t加1
                    LinkedList<int[]> q = new LinkedList<>();
                    q.add(new int[]{x, y}); // BFS队列初始化
                    while (!q.isEmpty()) {
                        int[] p = q.removeFirst(); // 弹出队列中的元素
                        // 遍历八个方向
                        for (int[] d : new int[][]{{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}}) {
                            int nx = p[0] + d[0], ny = p[1] + d[1];
                            // 检查新位置是否在矩阵内，并且是1
                            if (nx >= 0 && nx < n && ny >= 0 && ny < m && a[nx][ny] == 1) {
                                a[nx][ny] = 0; // 将访问过的1标记为0
                                q.add(new int[]{nx, ny}); // 将新位置加入队列
                            }
                        }
                    }
                }
            }
            System.out.println(t); // 输出连通区域的数量
        }
    }
}